﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Drawing;
using System.Collections;

using Noris.Schedule.Support;
using Noris.Schedule.Support.Data;
using Noris.Schedule.Support.Sql;
using Noris.Schedule.Support.Core;
using Noris.Schedule.Support.Services;

using Noris.Schedule.Planning.DataFace;
using System.Windows.Forms;

// Tento soubor obsahuje jednotky pro komunikaci plánovacího procesu s vizuální vrstvou
namespace Noris.Schedule.Planning.ProcessData
{
	// MfrPlanningConnectorCls : extenze datového konektoru pro přímý přístup k datům plánovacího procesu
	/// <summary>
	/// Konektor do plánovacího procesu ze strany vizuální prezentace.
	/// Poskytuje přístup k potřebným datům plánovacího procesu a vstupní metody pro řízení změn dat.
	/// </summary>
	public partial class MfrPlanningConnectorCls
	{
		#region PROPERTY PRO PUBLIC PŘÍSTUP K DATŮM PLÁNOVACÍHO PROCESU
		/// <summary>
		/// Indexovaný soupis jednotlivých položek materiálové osy
		/// </summary>
		public Dictionary<int, MaterialPlanAxisItemCls> DataAxisS 
		{ get { return new Dictionary<int, MaterialPlanAxisItemCls>(this.AxisHeap.AxisS); } }
		/// <summary>
		/// Indexovaný soupis jednotlivých položek kapacitních úkolů
		/// </summary>
		public Dictionary<int, CapacityPlanWorkItemCls> DataTaskC 
		{ get { return new Dictionary<int, CapacityPlanWorkItemCls>(this.AxisHeap.TaskC); } }
		/// <summary>
		/// Prostý soupis všech vztahů.
		/// </summary>
		public List<PlanningItemRelationCls> DataRelation 
		{ get { return new List<PlanningItemRelationCls>(this.AxisHeap.Relations.Values); } }
		/// <summary>
		/// Indexovaný soupis jednotlivých položek kapacitních jednotek
		/// </summary>
		public Dictionary<int, CapacityUnitCls> DataCapacityUnit 
		{ get { return new Dictionary<int, CapacityUnitCls>(this.CapacityData.UnitDict); } }
		#endregion
		#region METODY PRO VYHLEDÁNÍ DAT PLÁNOVACÍHO PROCESU
		/// <summary>
		/// Najde a vrátí záznam materiálové osy podle jeho ID.
		/// Pokud nenajde, vrátí null.
		/// </summary>
		/// <param name="axisID"></param>
		/// <returns></returns>
		public MaterialPlanAxisItemCls FindAxisSItem(int axisID)
		{ return this.AxisHeap.FindAxisSItem(axisID); }
		/// <summary>
		/// Najde a vrátí záznam kapacitního úkolu podle jeho ID.
		/// Pokud nenajde, vrátí null.
		/// </summary>
		/// <param name="taskID">Klíč kapacitního úkolu</param>
		/// <returns>Data kapacitního úkolu</returns>
		public CapacityPlanWorkItemCls FindTaskCItem(int taskID)
		{ return this.AxisHeap.FindTaskCItem(taskID); }
		/// <summary>
		/// Najde a vrátí záznam pracovního úkolu podle jeho ID.
		/// Pokud nenajde, vrátí null.
		/// </summary>
		/// <param name="workID">Klíč jednotky práce</param>
		/// <returns>Data jednotky práce</returns>
		public WorkUnitCls FindIWorkItem(int workID)
		{ return this.AxisHeap.FindIWorkItem(workID); }
		/// <summary>
		/// Vrátí soupis klíčů RelID vztahů.
		/// Pokud nenajde záznam pro hledaný klíč, vrátí prázdný seznam. Nevrací null.
		/// </summary>
		/// <param name="itemIDPrev">GID předchozí položky</param>
		/// <returns></returns>
		public List<int> FindRelationNextIDKeys(GID itemIDPrev)
		{ return this.AxisHeap.FindRelationNextIDKeys(itemIDPrev); }
		/// <summary>
		/// Vrátí soupis klíčů RelID vztahů.
		/// Pokud nenajde záznam pro hledaný klíč, vrátí prázdný seznam. Nevrací null.
		/// </summary>
		/// <param name="itemIDNext">GID následující položky</param>
		/// <returns></returns>
		public List<int> FindRelationPrevIDKeys(GID itemIDNext)
		{ return this.AxisHeap.FindRelationPrevIDKeys(itemIDNext); }
		/// <summary>
		/// Vrátí soupis vztahů na následující položky, na základě GID položky Prev.
		/// Pokud nenajde záznam pro hledaný klíč, vrátí prázdný seznam. Nevrací null.
		/// </summary>
		/// <param name="itemIDPrev">GID předchozí položky</param>
		/// <returns></returns>
		public List<PlanningItemRelationCls> FindRelationNextIDData(GID itemIDPrev)
		{ return this.AxisHeap.FindRelationNextIDData(itemIDPrev); }
		/// <summary>
		/// Vrátí soupis vztahů na následující položky, na základě GID položky Prev.
		/// Pokud nenajde záznam pro hledaný klíč, vrátí prázdný seznam. Nevrací null.
		/// </summary>
		/// <param name="itemIDPrev">GID předchozí položky</param>
		/// <param name="predicate">Predikát, který musí splnit vztahy, které budou vráceny ve výstupním poli</param>
		/// <returns></returns>
		public List<PlanningItemRelationCls> FindRelationNextIDData(GID itemIDPrev, Predicate<PlanningItemRelationCls> predicate)
		{ return this.AxisHeap.FindRelationNextIDData(itemIDPrev, predicate); }
		/// <summary>
		/// Vrátí soupis vztahů na předchozí položky, na základě GID položky Next.
		/// Pokud nenajde záznam pro hledaný klíč, vrátí prázdný seznam. Nevrací null.
		/// </summary>
		/// <param name="itemIDNext">GID následující položky</param>
		/// <returns></returns>
		public List<PlanningItemRelationCls> FindRelationPrevIDData(GID itemIDNext)
		{ return this.AxisHeap.FindRelationPrevIDData(itemIDNext); }
		/// <summary>
		/// Vrátí soupis vztahů na předchozí položky, na základě GID položky Next.
		/// Pokud nenajde záznam pro hledaný klíč, vrátí prázdný seznam. Nevrací null.
		/// </summary>
		/// <param name="itemIDNext">GID následující položky</param>
		/// <param name="predicate">Predikát, který musí splnit vztahy, které budou vráceny ve výstupním poli</param>
		/// <returns></returns>
		public List<PlanningItemRelationCls> FindRelationPrevIDData(GID itemIDNext, Predicate<PlanningItemRelationCls> predicate)
		{ return this.AxisHeap.FindRelationPrevIDData(itemIDNext, predicate); }
		/// <summary>
		/// Vrátí data plánovací jednotky.
		/// Pokud nenajde, vrátí null.
		/// </summary>
		/// <param name="planUnitC">Klíč kapacitní plánovací jednotky</param>
		/// <returns></returns>
		public CapacityUnitCls FindCapacityUnit(int planUnitC)
		{ return this.CapacityData.FindCapacityUnit(planUnitC); }
		/// <summary>
		/// Najde a vrátí kontinuální blok stavů kapacit, z dané kapacitní jednotky, pro daný časový interval.
		/// Pokud kapacitní jednotka neexistuje, vrací null.
		/// Pokud existuje, ale nemá stavy kapacit, vrací prázdný seznam.
		/// </summary>
		/// <param name="planUnitC">Klíč kapacitní plánovací jednotky</param>
		/// <param name="timeRange">Časový interval. 
		/// Vrací i hraniční prvky, tedy nejnižší: level.End = timeRange.Begin, nejvyšší: level.Begin = timeRange.End</param>
		public List<CapacityLevelItemCls> FindCapacityLevelsForUnit(int planUnitC, TimeRange timeRange)
		{
			CapacityUnitCls unit = this.CapacityData.FindCapacityUnit(planUnitC);
			if (unit == null) return null;
			return unit.GetCapacityLevels(timeRange);
		}
		/// <summary>
		/// Najde a vrátí soupis pracovních jednotek za požadovaný čas, z dané kapacitní jednotky, pro daný časový interval.
		/// Pokud kapacitní jednotka neexistuje, vrací null.
		/// Pokud existuje, ale nemá žádné pracovní jednotky, vrací prázdný seznam.
		/// </summary>
		/// <param name="planUnitC">Klíč kapacitní plánovací jednotky</param>
		/// <param name="timeRange">Časový interval. 
		/// Vrací i hraniční prvky, tedy nejnižší: level.End = timeRange.Begin, nejvyšší: level.Begin = timeRange.End</param>
		public List<IWorkUnitData> FindCapacityWorksForUnit(int planUnitC, TimeRange timeRange)
		{
			CapacityUnitCls unit = this.CapacityData.FindCapacityUnit(planUnitC);
			if (unit == null) return null;
			return unit.GetCapacityWorks(timeRange);
		}
		#endregion
		#region Metody pro čtení dat z technologické dokumentace
        /// <summary>
        /// Najde a vrátí data operace pro daný task.
        /// Nezávislé na druhu operace (STPV / VP).
        /// </summary>
        /// <param name="task"></param>
        /// <returns></returns>
        public IOperationData TpvGetOperationData(CapacityPlanWorkItemCls task)
        {
            switch (task.DocumentType)
            {
                case TDocumentType.PlanApproved:
                    return ((ITechnologyLibrary)this.PlanningData.TpvData).GetOperationData(task.DocumentKey, task.OperationKey, task.QtyFinal, NotFindMode.GetFromDbNull);
                case TDocumentType.Production:
                    return ((ITechnologyLibrary)this.PlanningData.ProductData).GetOperationData(task.DocumentKey, task.OperationKey, task.QtyFinal, NotFindMode.GetFromDbNull);
            }
            return null;
        }
		#endregion
	}
}
